package shoppingcart

type (
	ShoppingCartItem struct {
		Id     int64 `json:"id"`
		Number int32 `json:"number"`
	}
)

const (
	// 加入操作，写入并自增，如果写入失败则不自增【原子性、幂等性】 3天过期，活跃延迟
	luaAddScript = `
local qty = redis.call('GET',KEYS[1])
if qty == false then
  if redis.call('SET',KEYS[1],ARGV[1]) ~= false then
    redis.call('EXPIRE',KEYS[1],259200)
    redis.call('INCR',KEYS[2])
    return tonumber(ARGV[1])
  end
else
  local num = tonumber(qty) + tonumber(ARGV[1])
  if redis.call('SET',KEYS[1],num) ~= false then
    redis.call('EXPIRE',KEYS[1],259200)
    return num
  end
end
return -1
`

	// 删除操作，写入并递减，如果写入失败则不递减【原子性、幂等性】
	luaDeleteScript = `
if redis.call('DEL',KEYS[1]) == 1 then
  redis.call('DECR',KEYS[2])
  return redis.call('GET',KEYS[2])
end
return -1
`

	luaBatchDeleteScript = `
for _, itemKey in pairs(ARGV) do
  if redis.call('DEL',itemKey) ~= 1 then
    return -1
  end
  redis.call('DECR',KEYS[1])
end
return redis.call('GET',KEYS[1])
`

	luaClearScript = `
local itemKeyArr = redis.call('KEYS',KEYS[1])
for _, itemKey in pairs(itemKeyArr) do
  if redis.call('DEL',itemKey) ~= 1 then
    return -1
  end
end
redis.call('DEL',KEYS[2])
return 0
`

	luaListScript = `
local itemKeyArr = redis.call('KEYS',KEYS[1])
local items = {}
for _, itemKey in pairs(itemKeyArr) do
  local qty = redis.call('GET',itemKey)
  if qty ~= false then
    table.insert(items, itemKey)
    table.insert(items, qty)
  end
end
return items
`

	luaInitScript = `
if redis.call('SETNX',KEYS[1],ARGV[1]) == 1 then
  redis.call('EXPIRE',KEYS[1],259200)
  return 1
end
return 0
`

	luaUpdateScript = `
if redis.call('SET',KEYS[1],ARGV[1]) == 1 then
  redis.call('EXPIRE',KEYS[1],259200)
  return 1
end
return 0
`
)
